package com.wchen.project.zk.curator;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;

/**
 * @Desc:   使用 fluent 风格的 API 接口来创建一个 Zk 客户端
 * @author: cww
 * @DateTime: 2020/1/22 12:15
 */
public class ZkSessionByCuratorFluent {
    public static void main(String[] args) throws Exception{
        String path = "zk-book";
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("home:2181")
                .sessionTimeoutMs(5000)
                .retryPolicy(retryPolicy)
                .build();
        client.start();
        // 创建一个默认节点，初始内容为空，默认是持久节点
        client.create().forPath(path);
        // 创建一个附带初始内容的节点，这里任然是用 byte[]作为方法参数
        client.create().forPath(path, "init".getBytes());
        // 创建一个临时节点，初始内容为空
        client.create().withMode(CreateMode.EPHEMERAL).forPath(path);
        // 创建一个临时节点，并自动递归创建父节点
        // 注意：在 Zookeeper 中规定了所有非叶子节点必须为持久节点，使用如下的方法，只有path参数对应的数据节点是临时节点，
        // 其父节点均为持久节点
        client.create().creatingParentContainersIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path);
        System.out.println("childs: " + client.getChildren());
        Thread.sleep(5000);
    }

    /**
     * 使用 Curator 创建含隔离命名空间的会话
     */
    public void createNameSpace() {
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        CuratorFrameworkFactory.builder().connectString("home:2181")
                .sessionTimeoutMs(5000)
                .retryPolicy(retryPolicy)
                .namespace("base")
                .build();
    }
}